package gui;

import java.awt.Font;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;

import modelo.Agua;
import modelo.Arena;
import modelo.Asfalto;
import modelo.Caja;
import modelo.Celda;
import modelo.Coleccionable;
import modelo.Fuego;
import modelo.Mapa;
import modelo.Nivel;
import modelo.Pared;
import modelo.Piso;
import modelo.Planta;
import modelo.PremioBalas;
import modelo.PremioNafta;
import modelo.PremioPuntos;
import modelo.Robot;
import modelo.RobotCivil;
import modelo.RobotMilitar;

import org.newdawn.slick.BasicGame;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.font.*;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.geom.Shape;

import entradasalida.CargadorImagenes;

public class GUI_Tablero extends BasicGame{
	protected Comunicador comunicador;
	protected Nivel nivel;
	protected Mapa mapa;
	protected CargadorImagenes cargador;
	protected HashMap<String,Image> imagenes;
	protected boolean jugando;
	protected String mensaje = "Empiece a jugar";
	
	public GUI_Tablero(String title, Comunicador c) {
		super(title);
		this.comunicador = c;
	}

	@Override
	public void render(GameContainer arg0, Graphics arg1) throws SlickException {
		if(jugando) {
			for(int i=0;i<Mapa.CANT_FILAS;i++){
				for(int j=0;j<Mapa.CANT_COLUMNAS;j++)	{
					Celda c = this.mapa.obtenerCelda(i, j);
					//primero pintamos el piso
					String piso = c.obtenerPiso().obtenerIdentificador();
					imagenes.get(piso).draw(j*40, i*40);
					//luego habria que pintar la pintura, si la celda esta pintada
					if(c.estaPintadoBlanco()) {
						Image pinturaB = this.imagenes.get("pinturaBlanca");
						pinturaB.draw(j*40,i*40);
					}
					if(c.estaPintadoNegro()) {
						Image pinturaN = this.imagenes.get("pinturaNegra");
						pinturaN.draw(j*40,i*40);
					}
					//pintamos cualquier otra cosa que tenga la celda
					if(c.hayObstaculo()) {
						String obstaculo = c.obtenerObstaculo().obtenerIdentificador();
						imagenes.get(obstaculo).draw(j*40, i*40);
					}
					if(c.hayColeccionable()){
						String colec = c.obtenerColeccionable().obtenerIdentificador();
						imagenes.get(colec).draw(j*40,i*40);
					}
					if(c.hayPremio()){
						String premio =c.obtenerPremio().obtenerIdentificador();
						imagenes.get(premio).draw(j*40, i*40);
					}
					//si es la celda de ganar el nivel le hacemos un recuadro
					if(this.nivel.obtenerCeldaFin() == c) {
						arg1.setColor(Color.black);
						arg1.drawRect(j*40, i*40, 40, 40);
						arg1.setColor(Color.white);
					}
					
					
				}
				//por ultimo habria que dibujar el robot
				String robot = this.nivel.obtenerRobot().obtenerIdentificador();
				Image imRob = this.imagenes.get(robot);
				if(this.nivel.obtenerRobot().obtenerDireccion() == Robot.DERECHA) {
					imRob.draw(nivel.obtenerRobot().obtenerCelda().obtenerY()*40, nivel.obtenerRobot().obtenerCelda().obtenerX()*40);
				}
				if(this.nivel.obtenerRobot().obtenerDireccion() == Robot.IZQUIEDA) {
					imRob.rotate(180);
					imRob.draw(nivel.obtenerRobot().obtenerCelda().obtenerY()*40, nivel.obtenerRobot().obtenerCelda().obtenerX()*40);
					imRob.rotate(180);
				}
				if(this.nivel.obtenerRobot().obtenerDireccion() == Robot.ARRIBA) {
					imRob.rotate(270);
					imRob.draw(nivel.obtenerRobot().obtenerCelda().obtenerY()*40, nivel.obtenerRobot().obtenerCelda().obtenerX()*40);
					imRob.rotate(90);
				}
				if(this.nivel.obtenerRobot().obtenerDireccion() == Robot.ABAJO) {
					imRob.rotate(90);
					imRob.draw(nivel.obtenerRobot().obtenerCelda().obtenerY()*40, nivel.obtenerRobot().obtenerCelda().obtenerX()*40);
					imRob.rotate(270);
				}
				
				
			}
		}
		else {
			arg1.setBackground(Color.black);
			arg1.drawString(this.mensaje, 200, 200);
		}
	}

	@Override
	public void init(GameContainer arg0) throws SlickException {
		arg0.setShowFPS(false);
		//creamos el cargador
		cargador = new CargadorImagenes();
		//creamos el hashmap
		this.imagenes = new HashMap<String,Image>();
		
		
		jugando = false;
		pruebaModelo();
	}

	@Override
	public void update(GameContainer arg0, int arg1) throws SlickException {
		if(jugando) {
			this.comunicador.actualizarPuntos(this.nivel.obtenerRobot().obtenerPuntaje());
			this.comunicador.actualizarNafta(this.nivel.obtenerRobot().obtenerCombustible());
			Robot r = this.nivel.obtenerRobot();
			if(r instanceof RobotMilitar) 
				this.comunicador.actualizarBalas(((RobotMilitar)r).obtenerCantBalas()); 
			this.comunicador.actualizarBaulColeccionables(this.nivel.obtenerRobot().obtenerBaul());
			
			//controlamos si se gano
			if(this.nivel.obtenerRobot().obtenerCelda() == this.nivel.obtenerCeldaFin()) {
				this.jugando = false;
				this.mensaje = "Usted ha ganado!";
			}
			if(this.nivel.obtenerRobot().obtenerCombustible() <= 0) {
				this.jugando = false;
				this.mensaje = "Usted ha perdido!";
			}
		}
	}
	
	
	private void pruebaModelo() {
		cargarTodasImaganes();
		
	}
	
	private void cargarTodasImaganes() {
		Enumeration<String> claves = this.cargador.obtenerClaves();
		while(claves.hasMoreElements()) {
			String clave = claves.nextElement();
			String ruta = cargador.obtenerRuta(clave);
			try {
				this.imagenes.put(clave, new Image(ruta));
			} catch (SlickException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		 
	}
	
	

	public void keyPressed(int key, char c) {
		if(key==Input.KEY_LEFT) moverRobot(Robot.IZQUIEDA);
		if(key==Input.KEY_RIGHT) moverRobot(Robot.DERECHA);
		if(key==Input.KEY_UP) moverRobot(Robot.ARRIBA);
		if(key==Input.KEY_DOWN) moverRobot(Robot.ABAJO);
		if(key==Input.KEY_C) cargarColeccionableEnBaul();
		if(key==Input.KEY_D) descargarColeccionableBaul();
		if(key==Input.KEY_B) {
			seleccionarPinturaBlanca();
			this.comunicador.actualizarColorPinturaBlanca();
		}
		if(key==Input.KEY_N) {
			seleccionarPinturaNegra();
			this.comunicador.actualizarColorPinturaNegra();
		}
		if(key==Input.KEY_P) {
			desplegarPincel();
			this.comunicador.actualizarPintadoActivado();
		}
		if(key==Input.KEY_O) {
			guardarPincel();
			this.comunicador.actualizarPintadoDesactivado();
		}
		if(key==Input.KEY_SPACE) disparar();
	}
	
	
	public void cargarColeccionableEnBaul() {
		if(jugando) 
			this.nivel.obtenerRobot().agarrarColeccionable();
	}
	
	public void descargarColeccionableBaul() {
		if(jugando)
			this.nivel.obtenerRobot().descargarUltimoColeccionable();
	}
	
	public void moverRobot(int dir) {
		if(jugando)
			this.nivel.obtenerRobot().desplazar(dir);
	}
	
	public void disparar() {
		if(jugando) {
			Robot r = this.nivel.obtenerRobot();
			if(r instanceof RobotMilitar) 
				((RobotMilitar)r).disparar();
		}
	}
	
	public void seleccionarPinturaBlanca() {
		if(jugando)
			this.nivel.obtenerRobot().seleccionarPinturaBlanca();
	}
	
	public void seleccionarPinturaNegra(){
		if(jugando)
			this.nivel.obtenerRobot().seleccionarPinturaNegra();
	}
	
	public void desplegarPincel() {
		if(jugando)
			this.nivel.obtenerRobot().desplegarPincel();
	}
	
	public void guardarPincel() {
		if(jugando)
			this.nivel.obtenerRobot().guardarPincel(); 
	}
	
	public void reiniciarConRobotMilitar() {
		this.nivel = new Nivel();
		this.mapa = nivel.obtenerMapa();
		RobotMilitar rc = new RobotMilitar(this.nivel.obtenerCeldaInicio(),this.mapa);
		this.nivel.establecerRobot(rc);
		
		jugando = true;
	}
	
	public void reiniciarConRobotComercial() {
		this.nivel = new Nivel();
		this.mapa = nivel.obtenerMapa();
		RobotCivil rc = new RobotCivil(this.nivel.obtenerCeldaInicio(),this.mapa);
		this.nivel.establecerRobot(rc);
		
		jugando = true;
	}


}
